/*
深度遍历--二叉树
连接：https://leetcode.cn/problems/binary-tree-pruning/description/
题目：814. 二叉树剪枝


简介：递归解题

算法流程：
递归函数设计：void dfs(TreeNode*& root)
1. 返回值：⽆；
2. 参数 ：当前需要处理的节点；
3. 函数作⽤：判断当前节点是否需要删除，若需要删除，则删除当前节点。
后序遍历的主要流程：
1. 递归出⼝：当传⼊节点为空时，不做任何处理；
2. 递归处理左⼦树；
3. 递归处理右⼦树；
4. 处理当前节点：判断该节点是否为叶⼦节点（即左右⼦节点均被删除，当前节点成为叶⼦节点），
并且节点的值为 0：
a. 如果是，就删除掉；
b. 如果不是，就不做任何处理。
*/
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        if(root == nullptr) return nullptr;
        root->left = pruneTree(root->left);
        root->right = pruneTree(root->right);
        if(root->left==nullptr && root->right==nullptr && root->val == 0)
            root = nullptr;//delete root;//如果是开辟的空间，则需要释放
        return root;
    }
};
